﻿#include "Utils.h"
#include <QDebug>
#include <QRegularExpression>

QList<bool> quint16ToBoolList(quint16 value)
{
    QList<bool> boolList;
    for (int i = 0; i < 16; ++i) {
        // 将quint16右移i位，然后与1进行位与操作，结果为1则为true，为0则为false
        boolList.append((value >> i) & 1);
    }
    return boolList;
}


float quint16ToFloat(quint16 value1, quint16 value2)
{
    float fData = 0.0;
    quint32 u32Data = (static_cast<quint32>(value2) << 16) | value1;
    memcpy(&fData,&u32Data,sizeof (float));
    return fData;
}

QList<quint16> floatToQuint16(float value)
{
    QList<quint16>  quint16Datas;

    uint32_t intValue;
    memcpy(&intValue, &value, sizeof(value));

    // 分割成两个16位的部分
    quint16Datas << static_cast<quint16>(intValue & 0xFFFF) ;        // 取低16位
    quint16Datas << static_cast<quint16>((intValue >> 16) & 0xFFFF); // 取高16位
    return  quint16Datas;
}

QList<bool> quint8ListToBoolList(QList<quint8> values)
{
    QList<bool> boolList;
    foreach (auto value, values) {
        for (int i = 0; i < 8; ++i) {
            // 将quint16右移i位，然后与1进行位与操作，结果为1则为true，为0则为false
            boolList.append((value >> i) & 1);
        }
    }
    return boolList;
}

Utils::Utils()
{

}


quint16 quint16ModifyBit(quint16 data, int bitIndex, bool bitValue)
{
    Q_ASSERT(bitIndex >= 0 && bitIndex < 16); // 确保位索引在合法范围内

    if (bitValue) {
        // 如果要设置的位是1，使用位或操作(|)来设置指定的位
        data |= (1 << bitIndex);
    } else {
        // 如果要设置的位是0，使用位与操作(&)和位取反操作(~)来清除指定的位
        data &= ~(1 << bitIndex);
    }
    return data;
}

quint16 calculateCRC(const QByteArray &data)
{
    quint16 crc = 0xFFFF;
    for (int i = 0; i < data.size(); i++) {
        crc ^= (quint16)(data.at(i) & 0xFF);
        for (int j = 0; j < 8; j++) {
            if (crc & 0x0001) {
                crc = (crc >> 1) ^ 0xA001;
            } else {
                crc = crc >> 1;
            }
        }
    }
    return crc;
}

QList<QPushButton*> findButtonsWithSpecificName(QWidget *parent, const QString &pattern)
{
    QList<QPushButton*> btns;

    // 使用QRegExp进行匹配
    QRegExp regex("\\b" + pattern + "\\b");

    // 递归查找所有QPushButton子控件
    QList<QPushButton*> allButtons = parent->findChildren<QPushButton*>();

    foreach (QPushButton *button, allButtons) {
        // 检查按钮的objectName是否包含特定模式
        if (regex.indexIn(button->objectName()) != -1) {
            qDebug() << "Found button with name containing" << pattern << ":" << button->objectName();
            btns << button;
        }
    }
    return  btns;
}



quint16 boolListToQuint16(QList<bool> values)
{
    quint16 result = 0;
    if(values.size() != 16)
        return result;
    for (int i = 0; i < values.size(); ++i)
    {
        if (values.at(i)) {
            result |= (1 << i); // 如果boolList[i]为true，则在结果中的第i位设置为1
        }
    }

    return result;
}

QList<quint16> quint32toQuint16List(quint32 value)
{
    QList<quint16>  quint16Datas;

    // 分割成两个16位的部分
    quint16Datas << static_cast<quint16>(value & 0xFFFF) ;        // 取低16位
    quint16Datas << static_cast<quint16>((value >> 16) & 0xFFFF); // 取高16位
    return quint16Datas;
}

QString replaceFontSize(const QString &inputString, int increment)
{
    // 正则表达式，用于匹配形如 "font-size: 12px;" 的模式
    QRegularExpression regex("font-size:\\s*(\\d+)pt;");

    // 搜索匹配项
    QRegularExpressionMatch match = regex.match(inputString);

    if (match.hasMatch()) {
        // 获取匹配的数字部分
        QString numberStr = match.captured(1);
        // 将字符串转换为整数
        int fontSize = numberStr.toInt();
        // 增加字体大小
        fontSize += increment;
        // 替换原始字符串中的数字
        QString replacedString = inputString;
        replacedString.replace(match.capturedStart(1), match.capturedLength(1), QString::number(fontSize));
        return replacedString;
    } else {
        // 如果没有匹配项，返回原始字符串
        return inputString;
    }
}

quint16 swapBytes(quint16 value)
{
    return (value << 8) | (value >> 8);
}

QList<bool> invertBoolList(const QList<bool> &boolList)
{
    QList<bool> invertedList;
    for (bool value : boolList) {
        invertedList.append(!value);
    }
    return invertedList;
}

QString ByteArraytoQString16bitShow(QByteArray data)
{
    QString hexString = data.toHex();
    QString formattedHexString;

    // 遍历十六进制字符串，每两个字符之间插入一个空格
    for (int i = 0; i < hexString.length(); i += 2) {
        formattedHexString.append(hexString.mid(i, 2));
        if (i + 2 < hexString.length()) {
            formattedHexString.append(" ");
        }
    }
    return formattedHexString;
}
